/*  
  -- The Lime II Project -- 

  A tuplespaces-based middleware for coordinating agents and mobile hosts.
  Copyright (C) 2005.
  Gian Pietro Picco, Amy L. Murphy, Lorenzo Bellini.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received this copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

package lime2;
import java.util.Hashtable;

/**
 * A facility for forcing mutual exclusion (.. of protocols that manipulate the same tuplespace).
 * 
 * @author Gian Pietro Picco
 * @author Amy Murphy
 * @author Lorenzo Bellini
 */ 

class Token 
{
 // private data member	
 private static Hashtable tokens = new Hashtable();	
 private boolean owned = false;

 /**
  * Creates a new token.
  * 
  * @param name
  * @return new token
  */
 synchronized static Token get(String name)
 {
  Token ret = (Token) tokens.get(name);	
  if (ret == null) { ret = new Token(); tokens.put(name, ret); }
  return ret;
 }
 
 /**
  * Constructor method (private).
  */
 private Token()
 {
  // empty	
 }
 
 /**
  * Takes the token.
  */
 synchronized void take()
 {
  if (!owned) owned = true;	else try { wait(); } catch (InterruptedException ie) { ie.printStackTrace(); }
 }
 
 /**
  * Gives away the token.
  */
 synchronized void give()
 {
  owned = false;
  notifyAll();
 }
 
}
